package com.hy.study.practice.sparse;

/**
 * 这里是使用稀疏数组对棋盘进行输出
 */
public class SparseArrayDemo {
    private final static int ArraySize = 11;

    public static void main(String[] args) {
        //构造一个二位数组
        int[][] array = new int[ArraySize][ArraySize];
        //给普通数组赋值
        initArray(array);
        //将普通数组转换成稀疏数组
        int[][] sparseArray = ArrayToSparseArray(array);
        System.out.println("--------------普通数组--------------");
        printfArray(array);
        System.out.println("---------------稀疏数组-------------");
        printfArray(sparseArray);
        int[][] resultArray = SparseArrayToArray(sparseArray);
        System.out.println("---------------将稀疏数组还原之后的原数组----------------");
        printfArray(resultArray);

    }

    /**
     * 将稀疏数组换原
     *
     * @param sparseArray
     * @return
     */
    private static int[][] SparseArrayToArray(int[][] sparseArray) {
        //得到原始数组的行数,列数
        int rows = sparseArray[0][0];
        int col = sparseArray[0][1];
        int[][] array = new int[rows][col];
        //便利稀疏数组 这里第一行已经被使用了,从第二行开始读取
        for (int i = 1; i < sparseArray.length; i++) {
            int[] ints = sparseArray[i];
            int arrRows = ints[0];
            int arrCols = ints[1];
            int value = ints[2];
            array[arrRows][arrCols] = value;
        }
        return array;
    }

    private static void initArray(int[][] array) {
        array[1][1] = 1;
        array[2][2] = 1;
        array[1][0] = 1;
    }

    /**
     * 将普通数组转换成稀疏数组
     *
     * @param array
     * @return
     */
    private static int[][] ArrayToSparseArray(int[][] array) {
        //得到普通数组的 行 列  和 有效值个数
        int row = array.length;
        int col = array[0].length;
        int sum = 0;
        for (int[] ints : array) {
            for (int value : ints) {
                if (value != 0) {
                    sum++;
                }
            }
        }
        //稀疏数组的列默认是3  行数=实际有效数字+1
        // 第一行存放的数据 为  原数组的行个数  列个数  有效值
        // 第二行以后存放的数据为  当前有效数据在原来数组中的行 当前有效数据在原来数组中的列  当前有效数据在原来数组中的值
        int[][] sparse = new int[sum + 1][3];
        sparse[0][0] = row;
        sparse[0][1] = col;
        sparse[0][2] = sum;
        int count = 1;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                int value = array[i][j];
                if (value != 0) {
                    sparse[count][0] = i;
                    sparse[count][1] = j;
                    sparse[count][2] = value;
                    count++;
                }
            }
        }
        return sparse;
    }

    /**
     * 向控制台输出一个二位数组
     *
     * @param array
     */
    private static void printfArray(int[][] array) {
        for (int[] ints : array) {
            for (int value : ints) {
                System.out.printf("%d\t", value);
            }
            System.out.println();
        }
    }
}
